<?php

error_reporting(E_ALL & ~E_NOTICE);
// 应用公共文件

/*
 * 商家入驻状态定义
 */
//新申请
define('STORE_JOIN_STATE_NEW', 10);
//完成付款
define('STORE_JOIN_STATE_PAY', 11);
//初审成功
define('STORE_JOIN_STATE_VERIFY_SUCCESS', 20);
//初审失败
define('STORE_JOIN_STATE_VERIFY_FAIL', 30);
//付款审核失败
define('STORE_JOIN_STATE_PAY_FAIL', 31);
//开店成功
define('STORE_JOIN_STATE_FINAL', 40);


//商品状态
define('GOODS_STATE_ON', 1); // 出售中
define('GOODS_STATE_OUT', 0); // 下架
define('GOODS_STATE_OUT_LINE', 10); // 违规

define('GOODS_VERIFY_PASS', 1); // 审核通过
define('GOODS_VERIFY_FAIL', 0); // 审核失败
define('GOODS_VERIFY_WAIT', 10); // 等待审核
// 提货订单状态
define('DELIVERY_ORDER_DEFAULT', 10);   // 未到站
define('DELIVERY_ORDER_ARRIVE', 20);   // 已到站
define('DELIVERY_ORDER_PICKUP', 30);   // 已提取


/**
 *  订单状态
 */
//已取消
define('ORDER_STATE_CANCEL', 0);
//已产生但未支付
define('ORDER_STATE_NEW', 10);
//线下已提交支付凭证但未审核通过
define('ORDER_STATE_SUBMIT', 15);
//已支付
define('ORDER_STATE_PAY', 20);
//已发货
define('ORDER_STATE_SEND', 30);
//已收货，交易成功
define('ORDER_STATE_SUCCESS', 40);
//未付款订单，自动取消的天数
define('ORDER_AUTO_CANCEL_DAY', 3);
//已发货订单，自动确认收货的天数
define('ORDER_AUTO_RECEIVE_DAY', 7);
//兑换码支持过期退款，可退款的期限，默认为7天
define('CODE_INVALID_REFUND', 7);
//默认未删除
define('ORDER_DEL_STATE_DEFAULT', 0);
//已删除
define('ORDER_DEL_STATE_DELETE', 1);
//彻底删除
define('ORDER_DEL_STATE_DROP', 2);
//订单结束后可评论时间，15天，60*60*24*15
define('ORDER_EVALUATE_TIME', 1296000);
//抢购订单状态
define('OFFLINE_ORDER_CANCEL_TIME', 3); //单位为天


//以下是定义结算单状态
//默认
define('BILL_STATE_CREATE', 1);
//店铺已确认
define('BILL_STATE_STORE_COFIRM', 2);
//平台已审核
define('BILL_STATE_SYSTEM_CHECK', 3);
//结算完成
define('BILL_STATE_SUCCESS', 4);


//加解密使用
define('MD5_KEY', '1a6524ef2cd9607aa538fba37de47839');

//当前时间戳
define('TIMESTAMP', time());

/**
 * 更新登录Cookie信息
 * @param string $key  键值，uinfo时，整体更新
 * @param mixed  $data 值
 */
function update_login_info($key = '', $data = null)
{
    if ($data === null)
        cookie('uinfo', null);
    if (!$key || $key == 'uinfo') {
        cookie('uinfo', serialize($data));
    } else {
        $rs = cookie('uinfo');
        $data[$key] = $data;
        cookie('uinfo', serialize($rs));
    }
}

/**
 * 缓存读与写
 * @param type $key        为空时，不读写缓存
 * @param type $rpc        RPC接口
 * @param type $rpc_params RPC参数
 * @param type $time       缓存时间
 */
function cache_read_and_write($key, $rpc = '', $rpc_params = [], $tag = '', $time = 3600)
{
    $data = [];
    if ($key) {
        $data = \think\Cache::get($key);
    }

    if (!$data || !$key) {
        $data = rpc($rpc, $rpc_params);
        if ($key) {
            if ($tag) {
                \think\Cache::tag($tag)->set($key, $data, $time);
            } else {
                \think\Cache::set($key, $data, $time);
            }
        }
    }
    return $data;
}

/**
 * 百度编辑器内容
 *
 * @param int $id 编辑器id名称，与name同名
 * @param string $value 编辑器内容
 * @param string $width 宽 带px
 * @param string $height 高 带px
 * @param string $style 样式内容
 * @param string $upload_state 上传状态，默认是开启
 */
function showUEditor($id, $value = '', $width = '700px', $height = '300px', $style = 'visibility:hidden;', $isAppendTo = true)
{
    //百度编辑器初始化需要时间，如若想初始化编辑器的内容，则需要等待编辑器初始化才完成时再操作  KE.ready(function(){});
    $arr = array("\t", "\n", "\r");
    $value = str_replace('\'', '\"', $value);
    $oringin_str = '';
    if (!empty($value)) {
        //初始化时，要替换换行符和空格符
        $oringin_str = "var origin = '" . str_replace($arr, "", $value) . "';";
        $oringin_str .= "KE.setContent(origin);";
    }
    $oringin_str .= "KE.addListener('contentChange',function(){  });"; //加入内容变化监听事件
    echo '<script id="' . $id . '" style="width:' . $width . ';height:' . $height . ';' . $style . '"></script>';
    echo '
<script src="/old/data/resource//ueditor/ueditor.config.js" charset="utf-8"></script>
<script src="/old/data/resource//ueditor/ueditor.all.js" charset="utf-8"></script>
<script src="/old/data/resource//ueditor/lang/zh-cn/zh-cn.js" charset="utf-8"></script>
<script type="text/javascript">
	var KE = UE.getEditor("editor");' .
    'KE.ready(function() {' .
    $oringin_str .
    '});		
	KE.appendHtml = function(id,val) {
        KE.setContent(val,' . $isAppendTo . ');
	}
</script>
	';
    return true;
}

/**
 * 加密函数
 *
 * @param string $txt 需要加密的字符串
 * @param string $key 密钥
 * @return string 返回加密结果
 */
function encrypt($txt, $key = '')
{
    if (empty($txt))
        return $txt;
    if (empty($key))
        $key = md5(MD5_KEY);
    $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
    $ikey = "-x6g6ZWm2G9g_vr0Bo.pOq3kRIxsZ6rm";
    $nh1 = rand(0, 64);
    $nh2 = rand(0, 64);
    $nh3 = rand(0, 64);
    $ch1 = $chars{$nh1};
    $ch2 = $chars{$nh2};
    $ch3 = $chars{$nh3};
    $nhnum = $nh1 + $nh2 + $nh3;
    $knum = 0;
    $i = 0;
    while (isset($key{$i}))
        $knum += ord($key{$i++});
    $mdKey = substr(md5(md5(md5($key . $ch1) . $ch2 . $ikey) . $ch3), $nhnum % 8, $knum % 8 + 16);
    $txt = base64_encode(time() . '_' . $txt);
    $txt = str_replace(array('+', '/', '='), array('-', '_', '.'), $txt);
    $tmp = '';
    $j = 0;
    $k = 0;
    $tlen = strlen($txt);
    $klen = strlen($mdKey);
    for ($i = 0; $i < $tlen; $i++) {
        $k = $k == $klen ? 0 : $k;
        $j = ($nhnum + strpos($chars, $txt{$i}) + ord($mdKey{$k++})) % 64;
        $tmp .= $chars{$j};
    }
    $tmplen = strlen($tmp);
    $tmp = substr_replace($tmp, $ch3, $nh2 % ++$tmplen, 0);
    $tmp = substr_replace($tmp, $ch2, $nh1 % ++$tmplen, 0);
    $tmp = substr_replace($tmp, $ch1, $knum % ++$tmplen, 0);
    return $tmp;
}

/**
 * 解密函数
 *
 * @param string $txt 需要解密的字符串
 * @param string $key 密匙
 * @return string 字符串类型的返回结果
 */
function decrypt($txt, $key = '', $ttl = 0)
{
    if (empty($txt))
        return $txt;
    if (empty($key))
        $key = md5(MD5_KEY);

    $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
    $ikey = "-x6g6ZWm2G9g_vr0Bo.pOq3kRIxsZ6rm";
    $knum = 0;
    $i = 0;
    $tlen = @strlen($txt);
    while (isset($key{$i}))
        $knum += ord($key{$i++});
    $ch1 = @$txt{$knum % $tlen};
    $nh1 = strpos($chars, $ch1);
    $txt = @substr_replace($txt, '', $knum % $tlen--, 1);
    $ch2 = @$txt{$nh1 % $tlen};
    $nh2 = @strpos($chars, $ch2);
    $txt = @substr_replace($txt, '', $nh1 % $tlen--, 1);
    $ch3 = @$txt{$nh2 % $tlen};
    $nh3 = @strpos($chars, $ch3);
    $txt = @substr_replace($txt, '', $nh2 % $tlen--, 1);
    $nhnum = $nh1 + $nh2 + $nh3;
    $mdKey = substr(md5(md5(md5($key . $ch1) . $ch2 . $ikey) . $ch3), $nhnum % 8, $knum % 8 + 16);
    $tmp = '';
    $j = 0;
    $k = 0;
    $tlen = @strlen($txt);
    $klen = @strlen($mdKey);
    for ($i = 0; $i < $tlen; $i++) {
        $k = $k == $klen ? 0 : $k;
        $j = strpos($chars, $txt{$i}) - $nhnum - ord($mdKey{$k++});
        while ($j < 0)
            $j += 64;
        $tmp .= $chars{$j};
    }
    $tmp = str_replace(array('-', '_', '.'), array('+', '/', '='), $tmp);
    $tmp = trim(base64_decode($tmp));

    if (preg_match("/\d{10}_/s", substr($tmp, 0, 11))) {
        if ($ttl > 0 && (time() - substr($tmp, 0, 11) > $ttl)) {
            $tmp = null;
        } else {
            $tmp = substr($tmp, 11);
        }
    }
    return $tmp;
}

/**
 * 价格格式化
 *
 * @param int	$price
 * @return string	$price_format
 */
function ncPriceFormat($price)
{
    $price_format = number_format($price, 2, '.', '');
    return $price_format;
}

/**
 * 规范数据返回函数
 * @param unknown $state
 * @param unknown $msg
 * @param unknown $data
 * @return multitype:unknown
 */
function callback($state = true, $msg = '', $data = array())
{
    return array('status' => $state, 'msg' => $msg, 'data' => $data);
}

/**
 * 取得订单状态文字输出形式
 *
 * @param array $order_info 订单数组
 * @return string $order_state 描述输出
 */
function orderState($order_info)
{
    switch ($order_info['order_state']) {
        case ORDER_STATE_CANCEL:
            $order_state = '<span style="color:#999">已取消</span>';
            break;
        case ORDER_STATE_NEW:
            $order_state = '<span style="color:#36C">待付款</span>';
            break;
        case ORDER_STATE_SUBMIT:
            $order_state = '待确认';
            break;
        case ORDER_STATE_PAY:
            $order_state = '<span style="color:#F30">待发货</span>';
            break;
        case ORDER_STATE_SEND:
            $order_state = '<span style="color:#F30">待收货</span>';
            break;
        case ORDER_STATE_SUCCESS:
            $order_state = '<span style="color:#999">交易完成</span>';
            break;
    }
    return $order_state;
}

/**
 * 取得订单支付类型文字输出形式
 *
 * @param array $payment_code
 * @return string
 */
function orderPaymentName($payment_code)
{
    return str_replace(
            array('offline', 'online', 'alipay', 'tenpay', 'chinabank', 'predeposit', 'kqpay'), array('线下支付', '在线付款', '支付宝', '财付通', '网银在线', '站内余额支付', '快钱支付'), $payment_code);
}

/**
 * 取得订单商品销售类型文字输出形式
 *
 * @param array $goods_type
 * @return string 描述输出
 */
function orderGoodsType($goods_type)
{
    return str_replace(
            array('1', '2', '3', '4', '5'), array('', '抢购', '限时折扣', '优惠套装', '赠品'), $goods_type);
}

/**
 * 取得结算文字输出形式
 *
 * @param array $bill_state
 * @return string 描述输出
 */
function billState($bill_state)
{
    return str_replace(
            array('1', '2', '3', '4'), array('已出账', '商家已确认', '平台已审核', '结算完成'), $bill_state);
}

/**
 * 取得随机数
 *
 * @param int $length 生成随机数的长度
 * @param int $numeric 是否只产生数字随机数 1是0否
 * @return string
 */
function random($length, $numeric = 0)
{
    $seed = base_convert(md5(microtime() . $_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);
    $seed = $numeric ? (str_replace('0', '', $seed) . '012340567890') : ($seed . 'zZ' . strtoupper($seed));
    $hash = '';
    $max = strlen($seed) - 1;
    for ($i = 0; $i < $length; $i++) {
        $hash .= $seed{mt_rand(0, $max)};
    }
    return $hash;
}

/**
 * 通知邮件/通知消息 内容转换函数
 *
 * @param string $message 内容模板
 * @param array $param 内容参数数组
 * @return string 通知内容
 */
function ncReplaceText($message, $param)
{
    if (!is_array($param))
        return false;
    foreach ($param as $k => $v) {
        $message = str_replace('{$' . $k . '}', $v, $message);
    }
    return $message;
}

/**
 * 解压文件只支持zip格式（从原目录解压到目标目录）
 * @param $src  源文件绝对路径
 * @param $target  目标文件绝对路径（不带文件名）
 * @return mixed
 */
function unzip($src, $target_path) {
    //先判断待解压的文件是否存在
    if (!file_exists($src)) {
        return false;
    }
    //打开压缩包
    $resource = zip_open($src);
    //遍历读取压缩包里面的一个个文件
    while ($dir_resource = zip_read($resource)) {
        //如果能打开则继续
        if (zip_entry_open($resource, $dir_resource)) {
            //获取当前项目的名称,即压缩包里面当前对应的文件名
            $file_name = $target_path . zip_entry_name($dir_resource);
            //以最后一个“/”分割,再用字符串截取出路径部分
            $file_path = substr($file_name, 0, strrpos($file_name, "/"));
            ;
            //如果路径不存在，则创建一个目录，true表示可以创建多级目录
            if (!is_dir($file_path)) {
                mkdir($file_path, 0777, true);
            }
            //如果不是目录，则写入文件
            if (!is_dir($file_name)) {
                //读取这个文件
                $file_size = zip_entry_filesize($dir_resource);
                //最大读取6M，如果文件过大，跳过解压，继续下一个
                if ($file_size < (1024 * 1024 * 6)) {
                    $file_content = zip_entry_read($dir_resource, $file_size);
                    file_put_contents($file_name, $file_content);
                } else {
                    return false;
                }
            }
            //关闭当前
            zip_entry_close($dir_resource);
        }
    }
    //关闭压缩包
    zip_close($resource);
    return true;
}
